package com.xrh.xdemo.service.utils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import com.xrh.core.exceptions.BusinessException;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WordUtils {
	
	/**
	 * @function 富文本html内容转word文档
	 * @param output 输出流
	 * @param html 富文本html内容
	 * @author 肖荣辉
	 * @date 2023年12月22日
	*/
    public static void html2Word(OutputStream output , String html) {

    	POIFSFileSystem poifsFileSystem = null;
        
        try {
        	
        	//这里是必须要设置编码的，不然导出中文就会乱码。
        	byte b[] = html.getBytes("GBK"); 
            
        	//将字节数组包装到流中
        	ByteArrayInputStream bis = new ByteArrayInputStream(b);
            
        	poifsFileSystem = new POIFSFileSystem();
            
        	DirectoryEntry directory = poifsFileSystem.getRoot();
            
        	//该步骤不可省略，否则会出现乱码。
        	directory.createDocument("WordDocument", bis); 
            
            poifsFileSystem.writeFilesystem(output);
            
        } catch (Exception e) {
        	throw new BusinessException("富文本转word发生异常 , " + e.getMessage());
        } finally {
            try {
				poifsFileSystem.close();
			} catch (IOException e) {
				throw new BusinessException("富文本转word关闭流发生异常 , " + e.getMessage());
			}
        }
        
    }
    
    /**
	 * @function 用随机字符串替换里面的标签
	 * @param html
	 * @author 肖荣辉
	 * @date 2023年12月26日
	*/
    public  static   String replaceHtmlVarLabelByRandomStr(String html) {
    	
    	if(StrUtil.isEmpty(html))
    		return html;
    	
    	//标签匹配正则表达式
		String markReg = "<img class=\"varLabel\" src=\"/file/downLoadWordPng\\?valuePath=(\\w*\\W*)&word=(\\w*\\W*)\" />";
		
		List<String> list = ReUtil.findAllGroup0(markReg , html);
		
		if(CollUtil.isEmpty(list)) {
			log.info("未匹配到任何变量标签 , 无需替换 , 忽略..");
			return html;
		}
		
		Map<String , String> map = new HashMap<String, String>();
		
		for(String item : list) {
			
			//找到valuePath和word
			String valuePath = StrUtil.trim(ReUtil.getGroup1("valuePath=([^&\"]*)", item));
			String word = StrUtil.trim(ReUtil.getGroup1("word=([^&\"]*)", item));
			
			//随机一个字符串
			String value = RandomManUtils.getChineseName();
			
			log.info("需要替换标签 : " + word + " , 取值路径 : " + valuePath + " , 值 : " +  value);
			
			//把整个标签替换掉
			map.put(item , value);
			
		}
		
		//替换文本中的标签
		for(Entry<String, String> item : map.entrySet()) {
			html = StrUtil.replaceIgnoreCase(html , item.getKey(), item.getValue());
		}
		
    	return html;
    	
    }
    
    /**
	 * @function 替换html中的变量标签
	 * @param html
	 * @param data
	 * @author 肖荣辉
	 * @date 2023年12月26日
	*/
    public  static  <T> String replaceHtmlVarLabel(String html , T data) {
    	return replaceHtmlVarLabel(html, JSONUtil.parseObj(data));
    }
    
    /**
	 * @function 替换html中的变量标签
	 * @param html
	 * @param data
	 * @author 肖荣辉
	 * @date 2023年12月26日
	*/
    public static  String replaceHtmlVarLabel(String html , JSONObject data) {
    	
    	if(StrUtil.isEmpty(html))
    		return html;
    	
    	//标签匹配正则表达式
		String markReg = "<img class=\"varLabel\" src=\"/file/downLoadWordPng\\?valuePath=(\\w*\\W*)&word=(\\w*\\W*)\" />";
		
		List<String> list = ReUtil.findAllGroup0(markReg , html);
		
		if(CollUtil.isEmpty(list)) {
			log.info("未匹配到任何变量标签 , 无需替换 , 忽略..");
			return html;
		}
		
		Map<String , String> map = new HashMap<String, String>();
		
		for(String item : list) {
			
			//找到valuePath和word
			String valuePath = StrUtil.trim(ReUtil.getGroup1("valuePath=([^&\"]*)", item));
			String word = StrUtil.trim(ReUtil.getGroup1("word=([^&\"]*)", item));
			String value = JSONValueUtils.getStrFromJSONObject(data, valuePath);
			
			log.info("需要替换标签 : " + word + " , 取值路径 : " + valuePath + " , 值 : " +  value);
			
			//把整个标签替换掉
			map.put(item , value);
			
		}
		
		//替换文本中的标签
		for(Entry<String, String> item : map.entrySet()) {
			html = StrUtil.replaceIgnoreCase(html , item.getKey(), item.getValue());
		}
		
    	return html;
    	
    }
    
}
